#include "Hfifo.h"

#include<stdlib.h>


FIFO_t *mthis ; 

FIFO_t * GetFifo(FIFO_t * fifo) {
    mthis = fifo;
    return mthis ; 
}


/********************************************

 * 数据入队操作
 * 参数1：入队数据
 * 返回值：操作成功返回 0 ，否则返回 正数
 ********************************************/
int HFIFO_Push(Dtype data){
    if(mthis == 0 && mthis->buf == 0) return 1;//未创建 mini 队列
    mthis->buf[mthis->wptr] = data ;
    mthis->wptr ++ ;
    if( mthis->wptr == mthis->depth ) mthis->wptr = 0;
    mthis->full = ( ++ mthis->len >= mthis->depth) ? 1 : 0;
    mthis->empty = 0;
    return 0;
}
/********************************************
 * Pop
 * 数据出队操作
 * 返回值：出队的数据
 ********************************************/
Dtype HFIFO_Pop(void){
    if( --mthis->len <= 0) { mthis->empty = 1; }
    mthis->full = 0;
    Dtype rt = mthis->buf[mthis->rptr];
    mthis->rptr = (mthis->rptr >= mthis->depth ) ? 0 : mthis->rptr + 1;
    return rt;
}


void HFIFO_Clean() {
    free(mthis->buf) ;
}

/********************************************
 * mthisinit
 * 初始化 mini 队列
 * 参数1：FIFO_t对象
 * 参数2：数据缓存buf
 * 参数3：mini 队列大小(fifo深度)
 * 返回值：操作成功返回 0 ，否则返回 正数
 ********************************************/
int HFIFO_Init(FIFO_t *q, int bufSize){
    if( bufSize <= 0) return 1; 
    q->buf =  (Dtype *)malloc((bufSize+1)*sizeof(Dtype));
    q->empty = 1;
    q->full = 0 ;
    q->rptr = 0;
    q->wptr = 0;
    q->depth = bufSize; 
    q->len = 0;
    q->Push = HFIFO_Push;
    q->Pop = HFIFO_Pop ; 
    q->Clean = HFIFO_Clean;
    return 0;
}


